import { v } from "convex/values"
import { getAllOrThrow }  from "convex-helpers/server/relationships"
import { query } from "./_generated/server"

/**
 * 查询指定组织内的看板列表
 * 根据提供的组织ID（orgId）和可选的搜索关键字（search）或收藏状态（favorites），返回相应的看板列表
 * 需要用户身份验证，以确保只有授权用户可以访问数据
 * 
 * @param orgId - 组织ID，用于指定要查询的组织
 * @param search - 可选的搜索关键字，用于按标题搜索看板
 * @param favorites - 可选的收藏状态，用于筛选收藏的看板
 * @returns 返回一个包含看板信息及其收藏状态的Promise
 */
export const get = query({
  args: {
    orgId: v.string(),
    search: v.optional(v.string()),
    favorites: v.optional(v.string()),
  },
  handler: async (ctx, args) => {
    // 验证用户身份
    const identity = await ctx.auth.getUserIdentity();

    if (!identity) {
      throw new Error("Unauthorized");
    }
    
    if (args.favorites) {
      const favoriteBoards = await ctx.db
        .query("userFavorites")
        .withIndex("by_user_org", (q) =>
          q.eq("userId", identity.subject).eq("orgId", args.orgId)
        )
        .order("desc")
        .collect();

      const ids = favoriteBoards.map((favorite) => favorite.boardId);

      const boards = await getAllOrThrow(ctx.db, ids);

      return boards.map((board) => ({
        ...board,
        isFavorite: true,
      }));
    }




    // 获取搜索关键字
    const title = args.search as string;

    let boards = [];

    // 根据搜索关键字查询看板
    if (title) {
      boards = await ctx.db
        .query("boards")
        .withSearchIndex("search_index", (q) =>
          q.search("title", title).eq("orgId", args.orgId)
        )
        .collect();
    } else {
      // 使用withIndex进行查询，以支持快速检索
      // 使用order进行排序，以确保结果的顺序
      // 使用collect收集所有匹配的文档，以便进一步处理
      boards = await ctx.db
        .query("boards")
        .withIndex("by_org", (q) => q.eq("orgId", args.orgId))
        .order("desc")
        .collect();
    }

    // 对每个board进行操作，查询用户是否将其标记为收藏
    const boardsWithFavoriteRelation = boards.map((board) => {
      return ctx.db
        .query("userFavorites")
        .withIndex("by_user_board", (q) =>
          q.eq("userId", identity.subject).eq("boardId", board._id)
        )
        .unique()
        .then((favorite) => {
          // 将查询结果与原board数据合并，添加isFavorite字段
          return { ...board, isFavorite: !!favorite };
        });
    });

    // 使用Promise.all并行处理所有boards的收藏状态查询，提高效率
    const boardsWithFavoriteBoolean = Promise.all(boardsWithFavoriteRelation);

    return boardsWithFavoriteBoolean;
  },
});